package com.enjoyor.soa.traffic.server.tpcms.dubbo.invoke;

import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.alibaba.dubbo.config.annotation.Reference;
import com.enjoyor.soa.traffic.process.service.ProcessService;
import com.enjoyor.soa.traffic.process.vo.ProcessVo;

@Component
public class DubboProcessServiceInvoke {

    @Reference(timeout = 3000)
    private ProcessService dubboProcessService;

    @Value("${process.modal.id}")
    private String processDefinitionKey;

    /**
     * 启动流程引擎
     * 
     * @param passApplyId
     *            申请编号
     * @param userId
     *            操作用户ID
     * @param processDefinitionKey
     *            流程模板id
     */
    public String startProcess(String passApplyId) {
        String userId_key = "userid";
        String userId = "admin"; // 启动流程引擎不限制权限统一使用admin
        String processStart = dubboProcessService.start(userId_key, userId, passApplyId, processDefinitionKey);
        return processStart;
    }

    /**
     * 提交流程引擎操作,返回执行后的节点位置
     * 
     * @param passApplyId
     *            申请编号
     * @param userType
     *            提交用户类型 (detachment:支队 ;department:秩序科; leader:领导)
     * @param value
     *            条件参数 值 1，为通过 0，不通过
     * @return ProcessVo 返回当前节点， 任务id、任务标识 、任务名称、任务负责人，业务数据id
     */
    public ProcessVo submitProcess(String passApplyId, String userType, String value) {
        try {
            ProcessVo processVo = dubboProcessService.submitByBuskey_p(passApplyId, userType, "operation", value);
            return processVo;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw ex;
        }
    }

    /**
     * 
     * 根据业务数据id，返回信息包括任务id、任务标识 、任务名称、任务负责人，业务数据id
     * 
     * @param passApplyId
     *            申请编号
     * @return ProcessVo 返回一条， 任务id、任务标识 、任务名称、任务负责人，业务数据id
     */
    public ProcessVo getNowProcess(String passApplyId) {
        ProcessVo processVo = dubboProcessService.findTaskId_One(passApplyId);
        return processVo;
    }

    /**
     * 根据业务数据id获取所有的下一步节点信息
     * 
     * @param passApplyId
     *            申请编号
     * @return List<ProcessVo> 所有下一节点
     */
    public List<ProcessVo> getNextProcess(String passApplyId) {
        List<ProcessVo> processVoList = dubboProcessService.findTaskId(passApplyId);
        return processVoList;
    }

    /**
     * 返回当前用户的流程任务列表，返回信息包括任务id、任务标识 、任务名称、任务负责人，业务数据id
     * 
     * @param userType
     *            提交用户类型 (detachment:支队 ;department:秩序科; leader:领导)
     * @return List<ProcessVo> 任务id、任务标识 、任务名称、任务负责人，业务数据id
     */
    public List<ProcessVo> findTaskList(String userType) {
        List<ProcessVo> processVoList = dubboProcessService.findTaskList(userType, processDefinitionKey);
        return processVoList;
    }

    /**
     * 通过业务数据id查询流程实例id
     * 
     * @param passApplyId
     *            申请编号
     * @return processInstanceId 流程实例 id
     */
    public String queryProWithKey(String passApplyId) {
        String processInstanceId = dubboProcessService.queryProWithKey(passApplyId);
        return processInstanceId;
    }

    /**
     * 查询当前运行的流程实例
     * 
     * @param processDefinitionKey
     *            流程模板ID
     * @return List<ProcessVo>
     */
    public List<ProcessVo> findActivityList() {
        List<ProcessVo> processVoList = dubboProcessService.findActivityList(processDefinitionKey);
        return processVoList;
    }

    /**
     * 查询已结束的流程实例
     * 
     * @param processDefinitionKey
     *            流程模板ID
     * @return List<ProcessVo>
     */
    public List<ProcessVo> findFinishedList() {
        List<ProcessVo> processVoList = dubboProcessService.findFinishedList(processDefinitionKey);
        return processVoList;
    }

    /**
     * 根据 流程实例 id查询历史任务
     * 
     * @param processInstanceId
     *            流程实例 id
     * @return List<ProcessVo>
     */
    public List<ProcessVo> findTaskListByPid(String processInstanceId) {
        List<ProcessVo> processVoList = dubboProcessService.findTaskListByPid(processInstanceId, processDefinitionKey);
        return processVoList;
    }
}
